package udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

//Upd服务器
public class UdpServer {
    private DatagramSocket socket=null;
    public UdpServer(int port) throws SocketException {
        //给服务器绑定一个端口号
        socket=new DatagramSocket(port);
    }
    public void start() throws IOException {
        System.out.println("Udp服务器已启动");
        //让服务器7*24小时工作
        while(true){
            //构造用于接收请求数据报数据的缓存数据报
            DatagramPacket requstPacket=new DatagramPacket(new byte[1024],1024);
            //接收客户端发来的请求数据报,并通过receive方法将数据报中的数据填入到requestPacket缓存数据报中
            socket.receive(requstPacket);
            //解析请求数据报中的请求(提取并构建出字符串)，注意第3个参数不能使用
            //requstPacket.getData().length否则就会把数据报的整个数组都加到字符串(数组默认值)
            //因为我们只需要数据报中数组的有效数据内容
            String request=new String(requstPacket.getData(),0,requstPacket.getLength());
            //对请求进行逻辑处理，并返回一个回应字符串
            String respon=process(request);
            //构建返回个客户端的数据报,注意这里参数又使用的是requstPacket.getData().length
            //因为我们这里是要构造数据报中的数据，所以需要往数据包中整个数组进行操作
            //注意区分两者区别(简言之就是解析数据用requstPacket.getLength()，
            // 构造数据用requstPacket.getData().length)
            DatagramPacket responPacket=new DatagramPacket(respon.getBytes(),respon.getBytes().length,
                    requstPacket.getSocketAddress());
            //通过send方法返回给客户端处理好的数据报
            socket.send(responPacket);
            System.out.printf("[%s:%d %d] req=%s; resp=%s\n",requstPacket.getAddress().toString(),
                    requstPacket.getPort(), socket.getPort(),request,respon);

        }
    }

    //对请求进行回应要做的逻辑处理(一个服务器程序的关键之处)
    public String process(String request){
        return request+"回显处理";
    }

    public static void main(String[] args) throws IOException {
       UdpServer udpServer=new UdpServer(8000);
       udpServer.start();
    }
}
